home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / ttydebug / TTY.class (.txt)
Encoding:
Java Class File  |  1996-12-14  |  27.4 KB  |  1,446 lines

  1. package sun.tools.ttydebug;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.PrintStream;
  9. import java.net.InetAddress;
  10. import java.net.SocketException;
  11. import java.util.NoSuchElementException;
  12. import java.util.StringTokenizer;
  13. import sun.tools.debug.DebuggerCallback;
  14. import sun.tools.debug.NoSuchLineNumberException;
  15. import sun.tools.debug.RemoteArray;
  16. import sun.tools.debug.RemoteClass;
  17. import sun.tools.debug.RemoteDebugger;
  18. import sun.tools.debug.RemoteField;
  19. import sun.tools.debug.RemoteInt;
  20. import sun.tools.debug.RemoteObject;
  21. import sun.tools.debug.RemoteStackFrame;
  22. import sun.tools.debug.RemoteStackVariable;
  23. import sun.tools.debug.RemoteThread;
  24. import sun.tools.debug.RemoteThreadGroup;
  25. import sun.tools.debug.RemoteValue;
  26.  
  27. public class TTY implements DebuggerCallback {
  28.    RemoteDebugger debugger;
  29.    RemoteThread currentThread;
  30.    RemoteThreadGroup currentThreadGroup;
  31.    PrintStream out;
  32.    PrintStream console;
  33.    private String lastArgs;
  34.  
  35.    private RemoteThread indexToThread(int var1) throws Exception {
  36.       this.setDefaultThreadGroup();
  37.       RemoteThread[] var2 = this.currentThreadGroup.listThreads(true);
  38.       return var1 != 0 && var1 <= var2.length ? var2[var1 - 1] : null;
  39.    }
  40.  
  41.    private int parseThreadId(String var1) throws Exception {
  42.       if (var1.startsWith("t@")) {
  43.          var1 = var1.substring(2);
  44.       }
  45.  
  46.       int var2;
  47.       try {
  48.          var2 = Integer.valueOf(var1);
  49.       } catch (NumberFormatException var3) {
  50.          var2 = 0;
  51.       }
  52.  
  53.       if (this.indexToThread(var2) == null) {
  54.          this.out.println("\"" + var1 + "\" is not a valid thread id.");
  55.          return 0;
  56.       } else {
  57.          return var2;
  58.       }
  59.    }
  60.  
  61.    private void printPrompt() throws Exception {
  62.       if (this.currentThread == null) {
  63.          this.out.print("> ");
  64.       } else {
  65.          this.out.print(this.currentThread.getName() + "[" + (this.currentThread.getCurrentFrameIndex() + 1) + "] ");
  66.       }
  67.  
  68.       this.out.flush();
  69.    }
  70.  
  71.    public synchronized void printToConsole(String var1) throws Exception {
  72.       this.console.print(var1);
  73.       this.console.flush();
  74.    }
  75.  
  76.    public void breakpointEvent(RemoteThread var1) throws Exception {
  77.       this.out.print("\nBreakpoint hit: ");
  78.       RemoteStackFrame[] var2 = var1.dumpStack();
  79.       if (var2.length > 0) {
  80.          this.out.println(var2[0].toString());
  81.          this.currentThread = var1;
  82.       } else {
  83.          this.out.println("Invalid thread specified in breakpoint.");
  84.       }
  85.  
  86.       this.printPrompt();
  87.    }
  88.  
  89.    public void exceptionEvent(RemoteThread var1, String var2) throws Exception {
  90.       this.out.println("\n" + var2);
  91.       var1.setCurrentFrameIndex(0);
  92.       this.currentThread = var1;
  93.       this.printPrompt();
  94.    }
  95.  
  96.    public void threadDeathEvent(RemoteThread var1) throws Exception {
  97.       this.out.println("\n" + var1.getName() + " died.");
  98.       if (var1 == this.currentThread) {
  99.          this.currentThread = null;
  100.       }
  101.  
  102.       this.printPrompt();
  103.    }
  104.  
  105.    public void quitEvent() throws Exception {
  106.       String var1 = null;
  107.       if (this.lastArgs != null) {
  108.          StringTokenizer var2 = new StringTokenizer(this.lastArgs);
  109.          if (var2.hasMoreTokens()) {
  110.             var1 = new String("\n" + var2.nextToken() + " exited");
  111.          }
  112.       }
  113.  
  114.       if (var1 == null) {
  115.          var1 = new String("\nThe application exited");
  116.       }
  117.  
  118.       this.out.println(var1);
  119.       this.currentThread = null;
  120.       System.exit(0);
  121.    }
  122.  
  123.    void classes() throws Exception {
  124.       RemoteClass[] var1 = this.debugger.listClasses();
  125.       this.out.println("** classes list **");
  126.  
  127.       for(int var2 = 0; var2 < var1.length; ++var2) {
  128.          this.out.println(var1[var2].description());
  129.       }
  130.  
  131.    }
  132.  
  133.    void methods(StringTokenizer var1) throws Exception {
  134.       if (!var1.hasMoreTokens()) {
  135.          this.out.println("No class specified.");
  136.       } else {
  137.          String var2 = var1.nextToken();
  138.  
  139.          try {
  140.             RemoteClass var3 = this.getClassFromToken(var2);
  141.             RemoteField[] var4 = var3.getMethods();
  142.  
  143.             for(int var5 = 0; var5 < var4.length; ++var5) {
  144.                this.out.println(var4[var5].getTypedName());
  145.             }
  146.  
  147.          } catch (IllegalArgumentException var6) {
  148.             this.out.println("\"" + var2 + "\" is not a valid id or class name.");
  149.          }
  150.       }
  151.    }
  152.  
  153.    int printThreadGroup(RemoteThreadGroup var1, int var2) throws Exception {
  154.       this.out.println("Group " + var1.getName() + ":");
  155.       RemoteThread[] var3 = var1.listThreads(false);
  156.       int var4 = 0;
  157.       int var5 = 0;
  158.  
  159.       for(int var6 = 0; var6 < var3.length; ++var6) {
  160.          int var7 = var3[var6].description().length();
  161.          if (var7 > var4) {
  162.             var4 = var7;
  163.          }
  164.  
  165.          String var8 = var3[var6].getName();
  166.          int var9 = var8.lastIndexOf(46);
  167.          if (var9 >= 0 && var8.length() > var9) {
  168.             var8 = var8.substring(var9 + 1);
  169.          }
  170.  
  171.          if (var8.length() > var5) {
  172.             var5 = var8.length();
  173.          }
  174.       }
  175.  
  176.       for(int var14 = 0; var14 < var3.length; ++var14) {
  177.          char[] var15 = new char[80];
  178.  
  179.          for(int var17 = 0; var17 < 79; ++var17) {
  180.             var15[var17] = ' ';
  181.          }
  182.  
  183.          var15[79] = 0;
  184.          StringBuffer var10 = new StringBuffer();
  185.          var10.append(var15);
  186.          var10.insert(var14 + var2 + 1 < 10 ? 1 : 0, var14 + var2 + 1);
  187.          var10.insert(2, ".");
  188.          int var11 = 4;
  189.          var10.insert(var11, var3[var14].description());
  190.          var11 += var4 + 1;
  191.          String var12 = var3[var14].getName();
  192.          int var13 = var12.lastIndexOf(46);
  193.          if (var13 >= 0 && var12.length() > var13) {
  194.             var12 = var12.substring(var13 + 1);
  195.          }
  196.  
  197.          var10.insert(var11, var12);
  198.          var11 += var5 + 1;
  199.          var10.insert(var11, var3[var14].getStatus());
  200.          var10.setLength(79);
  201.          this.out.println(var10.toString());
  202.       }
  203.  
  204.       RemoteThreadGroup[] var16 = this.debugger.listThreadGroups(var1);
  205.  
  206.       for(int var18 = 0; var18 < var16.length; ++var18) {
  207.          if (var1 != var16[var18]) {
  208.             var2 += this.printThreadGroup(var16[var18], var2 + var3.length);
  209.          }
  210.       }
  211.  
  212.       return var3.length;
  213.    }
  214.  
  215.    private void setDefaultThreadGroup() throws Exception {
  216.       if (this.currentThreadGroup == null) {
  217.          RemoteThreadGroup[] var1 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  218.          this.currentThreadGroup = var1[0];
  219.       }
  220.  
  221.    }
  222.  
  223.    void threads(StringTokenizer var1) throws Exception {
  224.       if (!var1.hasMoreTokens()) {
  225.          this.setDefaultThreadGroup();
  226.          this.printThreadGroup(this.currentThreadGroup, 0);
  227.       } else {
  228.          String var2 = var1.nextToken();
  229.          RemoteThreadGroup[] var3 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  230.  
  231.          for(int var4 = 0; var4 < var3.length; ++var4) {
  232.             if (var2.equals(var3[var4].getName())) {
  233.                this.printThreadGroup(var3[var4], 0);
  234.                return;
  235.             }
  236.          }
  237.  
  238.          this.out.println(var2 + " is not a valid threadgroup name.");
  239.       }
  240.    }
  241.  
  242.    void threadGroups() throws Exception {
  243.       RemoteThreadGroup[] var1 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  244.  
  245.       for(int var2 = 0; var2 < var1.length; ++var2) {
  246.          this.out.println((new Integer(var2 + 1)).toString() + ". " + var1[var2].description() + " " + var1[var2].getName());
  247.       }
  248.  
  249.    }
  250.  
  251.    void setThread(int var1) throws Exception {
  252.       this.setDefaultThreadGroup();
  253.       RemoteThread var2 = this.indexToThread(var1);
  254.       if (var2 == null) {
  255.          this.out.println("\"" + var1 + "\" is not a valid thread id.");
  256.       } else {
  257.          this.currentThread = var2;
  258.       }
  259.    }
  260.  
  261.    void thread(StringTokenizer var1) throws Exception {
  262.       if (!var1.hasMoreTokens()) {
  263.          this.out.println("Thread number not specified.");
  264.       } else {
  265.          int var2 = this.parseThreadId(var1.nextToken());
  266.          if (var2 != 0) {
  267.             this.setThread(var2);
  268.          }
  269.       }
  270.    }
  271.  
  272.    void threadGroup(StringTokenizer var1) throws Exception {
  273.       if (!var1.hasMoreTokens()) {
  274.          this.out.println("Threadgroup name not specified.");
  275.       } else {
  276.          String var2 = var1.nextToken();
  277.          RemoteThreadGroup[] var3 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  278.  
  279.          for(int var4 = 0; var4 < var3.length; ++var4) {
  280.             if (var2.equals(var3[var4].getName())) {
  281.                this.currentThreadGroup = var3[var4];
  282.                return;
  283.             }
  284.          }
  285.  
  286.          this.out.println(var2 + " is not a valid threadgroup name.");
  287.       }
  288.    }
  289.  
  290.    void run(StringTokenizer var1) throws Exception {
  291.       String[] var2 = new String[100];
  292.       int var3 = 0;
  293.       if (!var1.hasMoreTokens() && this.lastArgs != null) {
  294.          var1 = new StringTokenizer(this.lastArgs);
  295.          this.out.println("run " + this.lastArgs);
  296.       }
  297.  
  298.       while(var1.hasMoreTokens()) {
  299.          var2[var3++] = var1.nextToken();
  300.          if (var3 == 1) {
  301.             RemoteClass var4 = this.debugger.findClass(var2[0]);
  302.             if (var4 == null) {
  303.                this.out.println("Could not load the " + var2[0] + " class.");
  304.                return;
  305.             }
  306.  
  307.             var2[0] = var4.getName();
  308.          }
  309.       }
  310.  
  311.       if (var3 > 0) {
  312.          RemoteThreadGroup var5 = this.debugger.run(var3, var2);
  313.          if (var5 != null) {
  314.             this.currentThreadGroup = var5;
  315.             this.setThread(1);
  316.             this.out.println("running ...");
  317.          } else {
  318.             this.out.println(var2[0] + " failed.");
  319.          }
  320.       } else {
  321.          this.out.println("No class name specified.");
  322.       }
  323.    }
  324.  
  325.    void load(StringTokenizer var1) throws Exception {
  326.       if (!var1.hasMoreTokens()) {
  327.          this.out.println("Class name not specified.");
  328.       } else {
  329.          String var2 = var1.nextToken();
  330.          RemoteClass var3 = this.debugger.findClass(var2);
  331.          if (var3 == null) {
  332.             this.out.print(var2 + " not found");
  333.             this.out.println(var2.indexOf(46) > 0 ? " (try the full name)" : "");
  334.          } else {
  335.             this.out.println(var3.toString());
  336.          }
  337.       }
  338.    }
  339.  
  340.    void suspend(StringTokenizer var1) throws Exception {
  341.       if (!var1.hasMoreTokens()) {
  342.          this.setDefaultThreadGroup();
  343.          RemoteThread[] var6 = this.currentThreadGroup.listThreads(true);
  344.  
  345.          for(int var7 = 0; var7 < var6.length; ++var7) {
  346.             var6[var7].suspend();
  347.          }
  348.  
  349.          this.out.println("All (non-system) threads suspended.");
  350.       } else {
  351.          while(var1.hasMoreTokens()) {
  352.             String var2 = var1.nextToken();
  353.  
  354.             int var3;
  355.             try {
  356.                var3 = Integer.valueOf(var2);
  357.             } catch (NumberFormatException var5) {
  358.                var3 = 0;
  359.             }
  360.  
  361.             RemoteThread var4 = this.indexToThread(var3);
  362.             if (var4 == null) {
  363.                this.out.println("\"" + var2 + "\" is not a valid thread id.");
  364.             } else {
  365.                var4.suspend();
  366.             }
  367.          }
  368.  
  369.       }
  370.    }
  371.  
  372.    void resume(StringTokenizer var1) throws Exception {
  373.       if (!var1.hasMoreTokens()) {
  374.          this.setDefaultThreadGroup();
  375.          RemoteThread[] var6 = this.currentThreadGroup.listThreads(true);
  376.  
  377.          for(int var7 = 0; var7 < var6.length; ++var7) {
  378.             var6[var7].resume();
  379.          }
  380.  
  381.          if (this.currentThread != null) {
  382.             this.currentThread.resetCurrentFrameIndex();
  383.          }
  384.  
  385.          this.out.println("All threads resumed.");
  386.       } else {
  387.          while(var1.hasMoreTokens()) {
  388.             String var2 = var1.nextToken();
  389.  
  390.             int var3;
  391.             try {
  392.                var3 = Integer.valueOf(var2);
  393.             } catch (NumberFormatException var5) {
  394.                var3 = 0;
  395.             }
  396.  
  397.             RemoteThread var4 = this.indexToThread(var3);
  398.             if (var4 == null) {
  399.                this.out.println("\"" + var2 + "\" is not a valid thread id.");
  400.             } else {
  401.                var4.resume();
  402.                if (var4 == this.currentThread) {
  403.                   this.currentThread.resetCurrentFrameIndex();
  404.                }
  405.             }
  406.          }
  407.  
  408.       }
  409.    }
  410.  
  411.    void cont() throws Exception {
  412.       if (this.currentThread == null) {
  413.          this.out.println("Nothing suspended.");
  414.       } else {
  415.          this.setDefaultThreadGroup();
  416.          RemoteThread[] var1 = this.currentThreadGroup.listThreads(true);
  417.  
  418.          for(int var2 = 0; var2 < var1.length; ++var2) {
  419.             var1[var2].cont();
  420.          }
  421.  
  422.          this.currentThread.resetCurrentFrameIndex();
  423.       }
  424.    }
  425.  
  426.    void step() throws Exception {
  427.       if (this.currentThread == null) {
  428.          this.out.println("Nothing suspended.");
  429.       } else {
  430.          try {
  431.             this.currentThread.step(true);
  432.          } catch (IllegalAccessError var1) {
  433.             this.out.println("Current thread is not at breakpoint.");
  434.          }
  435.       }
  436.    }
  437.  
  438.    void next() throws Exception {
  439.       if (this.currentThread == null) {
  440.          this.out.println("Nothing suspended.");
  441.       } else {
  442.          try {
  443.             this.currentThread.next();
  444.          } catch (IllegalAccessError var1) {
  445.             this.out.println("Current thread is not at breakpoint.");
  446.          }
  447.       }
  448.    }
  449.  
  450.    void kill(StringTokenizer var1) throws Exception {
  451.       if (!var1.hasMoreTokens()) {
  452.          this.out.println("Usage: kill <threadgroup name> or <thread id>");
  453.       } else {
  454.          while(var1.hasMoreTokens()) {
  455.             String var2 = var1.nextToken();
  456.  
  457.             int var3;
  458.             try {
  459.                var3 = Integer.valueOf(var2);
  460.             } catch (NumberFormatException var7) {
  461.                var3 = 0;
  462.             }
  463.  
  464.             RemoteThread var4 = this.indexToThread(var3);
  465.             if (var4 != null) {
  466.                this.out.println("killing thread: " + var4.getName());
  467.                var4.stop();
  468.                return;
  469.             }
  470.  
  471.             RemoteThreadGroup[] var5 = this.debugger.listThreadGroups((RemoteThreadGroup)null);
  472.             var5 = this.debugger.listThreadGroups(var5[0]);
  473.  
  474.             for(int var6 = 0; var6 < var5.length; ++var6) {
  475.                if (var5[var6].getName().equals(var2)) {
  476.                   this.out.println("killing threadgroup: " + var2);
  477.                   var5[var6].stop();
  478.                   return;
  479.                }
  480.             }
  481.  
  482.             this.out.println("\"" + var2 + "\" is not a valid threadgroup or id.");
  483.          }
  484.  
  485.       }
  486.    }
  487.  
  488.    void catchException(StringTokenizer var1) throws Exception {
  489.       if (var1.hasMoreTokens()) {
  490.          String var5 = var1.nextToken();
  491.  
  492.          try {
  493.             RemoteClass var6 = this.getClassFromToken(var5);
  494.             var6.catchExceptions();
  495.          } catch (Exception var4) {
  496.             this.out.println("Invalid exception class name: " + var5);
  497.          }
  498.       } else {
  499.          String[] var2 = this.debugger.getExceptionCatchList();
  500.  
  501.          for(int var3 = 0; var3 < var2.length; ++var3) {
  502.             this.out.print("  " + var2[var3]);
  503.             if ((var3 & 4) == 3 || var3 == var2.length - 1) {
  504.                this.out.println();
  505.             }
  506.          }
  507.  
  508.       }
  509.    }
  510.  
  511.    void ignoreException(StringTokenizer var1) throws Exception {
  512.       if (var1.hasMoreTokens()) {
  513.          String var5 = var1.nextToken();
  514.  
  515.          try {
  516.             RemoteClass var6 = this.getClassFromToken(var5);
  517.             var6.ignoreExceptions();
  518.          } catch (Exception var4) {
  519.             this.out.println("Invalid exception class name: " + var5);
  520.          }
  521.       } else {
  522.          String[] var2 = this.debugger.getExceptionCatchList();
  523.  
  524.          for(int var3 = 0; var3 < var2.length; ++var3) {
  525.             this.out.print("  " + var2[var3]);
  526.             if ((var3 & 4) == 3 || var3 == var2.length - 1) {
  527.                this.out.println();
  528.             }
  529.          }
  530.  
  531.       }
  532.    }
  533.  
  534.    // $FF: renamed from: up (java.util.StringTokenizer) void
  535.    void method_0(StringTokenizer var1) throws Exception {
  536.       if (this.currentThread == null) {
  537.          this.out.println("Current thread not set.");
  538.       } else {
  539.          int var2 = 1;
  540.          if (var1.hasMoreTokens()) {
  541.             String var3 = var1.nextToken();
  542.  
  543.             int var4;
  544.             try {
  545.                var4 = Integer.valueOf(var3);
  546.             } catch (NumberFormatException var7) {
  547.                var4 = 0;
  548.             }
  549.  
  550.             if (var4 == 0) {
  551.                this.out.println("Usage: up [n frames]");
  552.                return;
  553.             }
  554.  
  555.             var2 = var4;
  556.          }
  557.  
  558.          try {
  559.             this.currentThread.up(var2);
  560.          } catch (IllegalAccessError var5) {
  561.             this.out.println("Thread isn't suspended.");
  562.          } catch (ArrayIndexOutOfBoundsException var6) {
  563.             this.out.println("End of stack.");
  564.          }
  565.       }
  566.    }
  567.  
  568.    void down(StringTokenizer var1) throws Exception {
  569.       if (this.currentThread == null) {
  570.          this.out.println("Current thread not set.");
  571.       } else {
  572.          int var2 = 1;
  573.          if (var1.hasMoreTokens()) {
  574.             String var3 = var1.nextToken();
  575.  
  576.             int var4;
  577.             try {
  578.                var4 = Integer.valueOf(var3);
  579.             } catch (NumberFormatException var7) {
  580.                var4 = 0;
  581.             }
  582.  
  583.             if (var4 == 0) {
  584.                this.out.println("usage: down [n frames]");
  585.                return;
  586.             }
  587.  
  588.             var2 = var4;
  589.          }
  590.  
  591.          try {
  592.             this.currentThread.down(var2);
  593.          } catch (IllegalAccessError var5) {
  594.             this.out.println("Thread isn't suspended.");
  595.          } catch (ArrayIndexOutOfBoundsException var6) {
  596.             this.out.println("End of stack.");
  597.          }
  598.       }
  599.    }
  600.  
  601.    void dumpStack(RemoteThread var1) throws Exception {
  602.       RemoteStackFrame[] var2 = var1.dumpStack();
  603.       if (var2.length == 0) {
  604.          this.out.println("Thread is not running (no stack).");
  605.       } else {
  606.          int var3 = var2.length;
  607.  
  608.          for(int var4 = var1.getCurrentFrameIndex(); var4 < var3; ++var4) {
  609.             this.out.print("  [" + (var4 + 1) + "] ");
  610.             this.out.println(var2[var4].toString());
  611.          }
  612.  
  613.       }
  614.    }
  615.  
  616.    void where(StringTokenizer var1) throws Exception {
  617.       if (!var1.hasMoreTokens()) {
  618.          if (this.currentThread == null) {
  619.             this.out.println("No thread specified.");
  620.          } else {
  621.             this.dumpStack(this.currentThread);
  622.          }
  623.       } else {
  624.          String var2 = var1.nextToken();
  625.          if (!var2.toLowerCase().equals("all")) {
  626.             int var5 = this.parseThreadId(var2);
  627.             if (var5 != 0) {
  628.                this.dumpStack(this.indexToThread(var5));
  629.             }
  630.          } else {
  631.             this.setDefaultThreadGroup();
  632.             RemoteThread[] var3 = this.currentThreadGroup.listThreads(true);
  633.  
  634.             for(int var4 = 0; var4 < var3.length; ++var4) {
  635.                this.out.println(var3[var4].getName() + ": ");
  636.                this.dumpStack(var3[var4]);
  637.             }
  638.  
  639.          }
  640.       }
  641.    }
  642.  
  643.    void trace(String var1, StringTokenizer var2) throws Exception {
  644.       if (!var2.hasMoreTokens()) {
  645.          this.out.println("(i)trace < \"on\" | \"off\" >");
  646.       } else {
  647.          String var3 = var2.nextToken();
  648.          boolean var4;
  649.          if (var3.equals("on")) {
  650.             var4 = true;
  651.          } else {
  652.             if (!var3.equals("off")) {
  653.                this.out.println("(i)trace < \"on\" | \"off\" >");
  654.                return;
  655.             }
  656.  
  657.             var4 = false;
  658.          }
  659.  
  660.          if (var1.equals("trace")) {
  661.             this.debugger.trace(var4);
  662.          } else {
  663.             this.debugger.itrace(var4);
  664.          }
  665.       }
  666.    }
  667.  
  668.    void memory() throws Exception {
  669.       this.out.println("Free: " + this.debugger.freeMemory() + ", total: " + this.debugger.totalMemory());
  670.    }
  671.  
  672.    // $FF: renamed from: gc () void
  673.    void method_1() throws Exception {
  674.       RemoteObject[] var1 = new RemoteObject[]{this.currentThread, this.currentThreadGroup};
  675.       this.debugger.gc(var1);
  676.    }
  677.  
  678.    private RemoteClass getClassFromToken(String var1) throws Exception {
  679.       Object var2;
  680.       if (!var1.startsWith("0x") && !Character.isDigit(var1.charAt(0))) {
  681.          var2 = this.debugger.findClass(var1);
  682.          if (var2 == null) {
  683.             throw new IllegalArgumentException();
  684.          }
  685.       } else {
  686.          int var3;
  687.          try {
  688.             var3 = RemoteValue.fromHex(var1);
  689.          } catch (NumberFormatException var4) {
  690.             var3 = 0;
  691.          }
  692.  
  693.          if (var3 == 0 || (var2 = this.debugger.get(new Integer(var3))) == null) {
  694.             throw new IllegalArgumentException();
  695.          }
  696.  
  697.          if (!(var2 instanceof RemoteClass)) {
  698.             throw new IllegalArgumentException();
  699.          }
  700.       }
  701.  
  702.       return (RemoteClass)var2;
  703.    }
  704.  
  705.    void listBreakpoints() throws Exception {
  706.       String[] var1 = this.debugger.listBreakpoints();
  707.       if (var1.length <= 0) {
  708.          this.out.println("No breakpoints set.");
  709.       } else {
  710.          this.out.println("Current breakpoints set:");
  711.  
  712.          for(int var2 = 0; var2 < var1.length; ++var2) {
  713.             this.out.println("\t" + var1[var2]);
  714.          }
  715.  
  716.       }
  717.    }
  718.  
  719.    void stop(StringTokenizer var1) throws Exception {
  720.       if (!var1.hasMoreTokens()) {
  721.          this.listBreakpoints();
  722.       } else {
  723.          Object var2 = null;
  724.  
  725.          try {
  726.             String var3 = var1.nextToken();
  727.             if (var3.equals("at")) {
  728.                boolean var4 = true;
  729.             } else {
  730.                if (!var3.equals("in")) {
  731.                   this.out.println("Usage: stop at <class>:<line_number> or");
  732.                   this.out.println("       stop in <class>.<method_name>");
  733.                   return;
  734.                }
  735.  
  736.                boolean var17 = false;
  737.             }
  738.  
  739.             if (var3.equals("at")) {
  740.                String var16 = var1.nextToken(": \t\n\r");
  741.                RemoteClass var19 = this.getClassFromToken(var16);
  742.                String var20 = var1.nextToken();
  743.                int var22 = Integer.valueOf(var20);
  744.                String var23 = var19.setBreakpointLine(var22);
  745.                if (var23.length() > 0) {
  746.                   this.out.println(var23);
  747.                } else {
  748.                   this.out.println("Breakpoint set at " + var19.getName() + ":" + var22);
  749.                }
  750.             } else {
  751.                String var14 = var1.nextToken(": \t\n\r");
  752.                Object var5 = null;
  753.                String var6 = null;
  754.  
  755.                try {
  756.                   var18 = this.getClassFromToken(var14);
  757.                } catch (IllegalArgumentException var10) {
  758.                   int var7 = var14.lastIndexOf(".");
  759.                   if (var7 == -1) {
  760.                      this.out.println("\"" + var14 + "\" is not a valid id or class name.");
  761.                      return;
  762.                   }
  763.  
  764.                   var6 = var14.substring(var7 + 1);
  765.                   var14 = var14.substring(0, var7);
  766.                   var18 = this.getClassFromToken(var14);
  767.                }
  768.  
  769.                if (var6 == null) {
  770.                   var6 = var1.nextToken();
  771.                }
  772.  
  773.                RemoteField var21;
  774.                try {
  775.                   var21 = var18.getMethod(var6);
  776.                } catch (NoSuchMethodException var9) {
  777.                   this.out.println("Class " + var18.getName() + " doesn't have a method " + var6);
  778.                   return;
  779.                }
  780.  
  781.                String var8 = var18.setBreakpointMethod(var21);
  782.                if (var8.length() > 0) {
  783.                   this.out.println(var8);
  784.                } else {
  785.                   this.out.println("Breakpoint set in " + var18.getName() + "." + var6);
  786.                }
  787.             }
  788.          } catch (NoSuchElementException var11) {
  789.             this.out.println("Usage: stop at <class>:<line_number> or");
  790.             this.out.println("       stop in <class>.<method_name>");
  791.          } catch (NumberFormatException var12) {
  792.             this.out.println("Invalid line number.");
  793.          } catch (IllegalArgumentException var13) {
  794.             this.out.println("\"" + var2 + "\" is not a valid id or class name.");
  795.          }
  796.       }
  797.    }
  798.  
  799.    void clear(StringTokenizer var1) throws Exception {
  800.       if (!var1.hasMoreTokens()) {
  801.          this.listBreakpoints();
  802.       } else {
  803.          Object var2 = null;
  804.          Object var3 = null;
  805.          Object var4 = null;
  806.  
  807.          try {
  808.             String var13 = var1.nextToken(": \t\n\r");
  809.  
  810.             try {
  811.                var17 = this.getClassFromToken(var13);
  812.             } catch (IllegalArgumentException var9) {
  813.                int var5 = var13.lastIndexOf(".");
  814.                if (var5 == -1) {
  815.                   this.out.println("\"" + var13 + "\" is not a valid id or class name.");
  816.                   return;
  817.                }
  818.  
  819.                String var15 = var13.substring(var5 + 1);
  820.                var13 = var13.substring(0, var5);
  821.                RemoteClass var16 = this.getClassFromToken(var13);
  822.  
  823.                RemoteField var6;
  824.                try {
  825.                   var6 = var16.getMethod(var15);
  826.                } catch (NoSuchMethodException var8) {
  827.                   this.out.println("\"" + var15 + "\" is not a valid method name of class " + var16.getName());
  828.                   return;
  829.                }
  830.  
  831.                String var7 = var16.clearBreakpointMethod(var6);
  832.                if (var7.length() > 0) {
  833.                   this.out.println(var7);
  834.                   return;
  835.                }
  836.  
  837.                this.out.println("Breakpoint cleared at " + var16.getName() + "." + var15);
  838.                return;
  839.             }
  840.  
  841.             String var18 = var1.nextToken();
  842.             int var19 = Integer.valueOf(var18);
  843.             String var20 = var17.clearBreakpointLine(var19);
  844.             if (var20.length() > 0) {
  845.                this.out.println(var20);
  846.             } else {
  847.                this.out.println("Breakpoint cleared at " + var17.getName() + ": " + var19);
  848.             }
  849.          } catch (NoSuchElementException var10) {
  850.             this.out.println("Usage: clear <class>:<line_number>");
  851.             this.out.println("   or: clear <class>.<method>");
  852.          } catch (NumberFormatException var11) {
  853.             this.out.println("Usage: clear <class>:<line_number>");
  854.             this.out.println("   or: clear <class>.<method>");
  855.          } catch (IllegalArgumentException var12) {
  856.             this.out.println("\"" + var2 + "\" is not a valid id or class name.");
  857.          }
  858.       }
  859.    }
  860.  
  861.    void list(StringTokenizer var1) throws Exception {
  862.       Object var2 = null;
  863.       if (this.currentThread == null) {
  864.          this.out.println("No thread specified.");
  865.       } else {
  866.          try {
  867.             var16 = this.currentThread.getCurrentFrame();
  868.          } catch (IllegalAccessError var14) {
  869.             this.out.println("Current thread isn't suspended.");
  870.             return;
  871.          } catch (ArrayIndexOutOfBoundsException var15) {
  872.             this.out.println("Thread is not running (no stack).");
  873.             return;
  874.          }
  875.  
  876.          int var3;
  877.          if (var1.hasMoreTokens()) {
  878.             String var4 = var1.nextToken();
  879.  
  880.             try {
  881.                var3 = Integer.valueOf(var4);
  882.             } catch (NumberFormatException var13) {
  883.                try {
  884.                   var3 = var16.getRemoteClass().getMethodLineNumber(var4);
  885.                } catch (NoSuchMethodException var11) {
  886.                   this.out.println(var4 + " is not a valid line number or " + "method name for class " + var16.getRemoteClass().getName());
  887.                   return;
  888.                } catch (NoSuchLineNumberException var12) {
  889.                   this.out.println("Line number information not found in " + var16.getRemoteClass().getName());
  890.                   return;
  891.                }
  892.             }
  893.          } else {
  894.             var3 = var16.getLineNumber();
  895.          }
  896.  
  897.          int var17 = var3 > 4 ? var3 - 4 : 1;
  898.          int var5 = var17 + 9;
  899.          InputStream var6 = var16.getRemoteClass().getSourceFile();
  900.          if (var6 == null) {
  901.             this.out.println("Unable to find " + var16.getRemoteClass().getSourceFileName());
  902.          } else {
  903.             DataInputStream var7 = new DataInputStream(var6);
  904.             String var8 = null;
  905.  
  906.             for(int var9 = 1; var9 <= var17; ++var9) {
  907.                var8 = var7.readLine();
  908.             }
  909.  
  910.             if (var8 == null) {
  911.                this.out.println((new Integer(var3)).toString() + " is an invalid line number for the file " + var16.getRemoteClass().getSourceFileName());
  912.             }
  913.  
  914.             for(int var10 = var17; var10 < var5 && var8 != null; ++var10) {
  915.                this.out.print((new Integer(var10)).toString() + "\t" + (var10 == var3 ? "=> " : "   "));
  916.                this.out.println(var8);
  917.                var8 = var7.readLine();
  918.             }
  919.  
  920.          }
  921.       }
  922.    }
  923.  
  924.    void use(StringTokenizer var1) throws Exception {
  925.       if (!var1.hasMoreTokens()) {
  926.          this.out.println(this.debugger.getSourcePath());
  927.       } else {
  928.          this.debugger.setSourcePath(var1.nextToken());
  929.       }
  930.    }
  931.  
  932.    void locals() throws Exception {
  933.       if (this.currentThread == null) {
  934.          this.out.println("No default thread specified: use the \"thread\" command first.");
  935.       } else {
  936.          RemoteStackVariable[] var1 = this.currentThread.getStackVariables();
  937.          if (var1 != null && var1.length != 0) {
  938.             this.out.println("Method arguments:");
  939.  
  940.             for(int var2 = 0; var2 < var1.length; ++var2) {
  941.                if (var1[var2].methodArgument()) {
  942.                   this.out.print("  " + var1[var2].getName());
  943.                   if (var1[var2].inScope()) {
  944.                      this.out.println(" = " + var1[var2].getValue().toString());
  945.                   } else {
  946.                      this.out.println(" is not in scope (WHAT???)");
  947.                   }
  948.                }
  949.             }
  950.  
  951.             this.out.println("Local variables:");
  952.  
  953.             for(int var3 = 0; var3 < var1.length; ++var3) {
  954.                if (!var1[var3].methodArgument()) {
  955.                   this.out.print("  " + var1[var3].getName());
  956.                   if (var1[var3].inScope()) {
  957.                      this.out.println(" = " + var1[var3].getValue().toString());
  958.                   } else {
  959.                      this.out.println(" is not in scope.");
  960.                   }
  961.                }
  962.             }
  963.  
  964.          } else {
  965.             this.out.println("No local variables: try compiling with -g");
  966.          }
  967.       }
  968.    }
  969.  
  970.    boolean print(StringTokenizer var1, boolean var2, boolean var3) throws Exception {
  971.       if (!var1.hasMoreTokens()) {
  972.          this.out.println("No objects specified.");
  973.          return false;
  974.       } else {
  975.          while(var1.hasMoreTokens()) {
  976.             Object var5 = null;
  977.             String var6 = ".[(";
  978.             String var7 = var1.nextToken();
  979.             StringTokenizer var8 = new StringTokenizer(var7, var6, true);
  980.             String var9 = var8.nextToken();
  981.             if (var9.startsWith("t@")) {
  982.                this.setDefaultThreadGroup();
  983.                RemoteThread[] var30 = this.currentThreadGroup.listThreads(true);
  984.  
  985.                int var24;
  986.                try {
  987.                   var24 = Integer.valueOf(var9.substring(2));
  988.                } catch (NumberFormatException var23) {
  989.                   var24 = 0;
  990.                }
  991.  
  992.                if (var24 <= 0 || var24 > var30.length) {
  993.                   this.out.println("\"" + var9 + "\" is not a valid thread id.");
  994.                   return false;
  995.                }
  996.  
  997.                var5 = var30[var24 - 1];
  998.             } else if (var9.startsWith("$s")) {
  999.                int var29;
  1000.                try {
  1001.                   var29 = Integer.valueOf(var9.substring(2));
  1002.                } catch (NumberFormatException var22) {
  1003.                   this.out.println("\"" + var9 + "\" is not a valid slot.");
  1004.                   return false;
  1005.                }
  1006.  
  1007.                if (this.currentThread != null) {
  1008.                   RemoteStackVariable[] var12 = this.currentThread.getStackVariables();
  1009.                   if (var12 == null || var29 >= var12.length) {
  1010.                      this.out.println("\"" + var9 + "\" is not a valid slot.");
  1011.                      return false;
  1012.                   }
  1013.  
  1014.                   var5 = var12[var29].getValue();
  1015.                }
  1016.             } else if (!var9.startsWith("0x") && !Character.isDigit(var9.charAt(0))) {
  1017.                if (this.currentThread != null) {
  1018.                   RemoteStackVariable var11 = this.currentThread.getStackVariable(var9);
  1019.                   if (var11 != null && !var11.inScope()) {
  1020.                      this.out.println(var9 + " is not in scope.");
  1021.                      return false;
  1022.                   }
  1023.  
  1024.                   var5 = var11 == null ? null : var11.getValue();
  1025.                }
  1026.  
  1027.                if (var5 == null) {
  1028.                   if (!var9.equals("this")) {
  1029.                      String var28 = "this." + var9;
  1030.                      if (this.print(new StringTokenizer(var28), var2, true)) {
  1031.                         return true;
  1032.                      }
  1033.                   }
  1034.  
  1035.                   var5 = this.debugger.findClass(var9);
  1036.                   if (var5 == null) {
  1037.                      if (!var3) {
  1038.                         this.out.println("\"" + var7 + "\" is not a " + "valid id or class name.");
  1039.                      }
  1040.  
  1041.                      return false;
  1042.                   }
  1043.                }
  1044.             } else {
  1045.                int var4;
  1046.                try {
  1047.                   var4 = RemoteValue.fromHex(var9);
  1048.                } catch (NumberFormatException var19) {
  1049.                   var4 = 0;
  1050.                }
  1051.  
  1052.                if (var4 == 0 || (var5 = this.debugger.get(new Integer(var4))) == null) {
  1053.                   this.out.println("\"" + var9 + "\" is not a valid id.");
  1054.                   return false;
  1055.                }
  1056.             }
  1057.  
  1058.             RemoteInt var31 = new RemoteInt(-1);
  1059.             Object var32 = var31;
  1060.             String var13 = "";
  1061.             var9 = var8.hasMoreTokens() ? var8.nextToken() : null;
  1062.  
  1063.             while(var9 != null) {
  1064.                if (!var9.equals(".")) {
  1065.                   if (!var9.equals("[")) {
  1066.                      if (var9.equals("(")) {
  1067.                         this.out.println("print <method> not supported yet.");
  1068.                         return false;
  1069.                      }
  1070.  
  1071.                      this.out.println("invalid expression");
  1072.                      return false;
  1073.                   }
  1074.  
  1075.                   if (!var8.hasMoreTokens()) {
  1076.                      this.out.println("\"" + var7 + "\" is not a valid expression.");
  1077.                      return false;
  1078.                   }
  1079.  
  1080.                   var9 = var8.nextToken("]");
  1081.  
  1082.                   try {
  1083.                      int var14 = Integer.valueOf(var9);
  1084.                      var32 = ((RemoteArray)var32).getElement(var14);
  1085.                   } catch (NumberFormatException var20) {
  1086.                      this.out.println("\"" + var9 + "\" is not a valid decimal number.");
  1087.                      return false;
  1088.                   } catch (ArrayIndexOutOfBoundsException var21) {
  1089.                      this.out.println(var9 + " is out of bounds for " + ((RemoteValue)var5).description());
  1090.                      return false;
  1091.                   }
  1092.  
  1093.                   if (var32 != null && ((RemoteValue)var32).isObject()) {
  1094.                      var5 = var32;
  1095.                      var32 = var31;
  1096.                   }
  1097.  
  1098.                   if (!var8.hasMoreTokens() || !var8.nextToken().equals("]")) {
  1099.                      this.out.println("\"" + var7 + "\" is not a valid expression.");
  1100.                      return false;
  1101.                   }
  1102.  
  1103.                   var9 = var8.hasMoreTokens() ? var8.nextToken(var6) : null;
  1104.                } else {
  1105.                   if (!var8.hasMoreTokens()) {
  1106.                      this.out.println("\"" + var7 + "\" is not a valid expression.");
  1107.                      return false;
  1108.                   }
  1109.  
  1110.                   var9 = var8.nextToken();
  1111.                   if (var32 != var31) {
  1112.                      this.out.println("\"" + var13 + "\" is not an object.");
  1113.                      return false;
  1114.                   }
  1115.  
  1116.                   var13 = var9;
  1117.                   var32 = ((RemoteObject)var5).getFieldValue(var9);
  1118.                   if (var32 == null) {
  1119.                      this.out.println("\"" + var9 + "\" is not a valid field of " + ((RemoteValue)var5).description());
  1120.                      return false;
  1121.                   }
  1122.  
  1123.                   if (((RemoteValue)var32).isObject()) {
  1124.                      var5 = var32;
  1125.                      var32 = var31;
  1126.                   }
  1127.  
  1128.                   var9 = var8.hasMoreTokens() ? var8.nextToken() : null;
  1129.                }
  1130.             }
  1131.  
  1132.             this.out.print(var7 + " = ");
  1133.             if (var32 != var31) {
  1134.                this.out.println(var32 == null ? "null" : ((RemoteValue)var32).description());
  1135.             } else if (var2 && var5 instanceof RemoteObject) {
  1136.                this.out.println(((RemoteValue)var5).description() + " {");
  1137.                if (var5 instanceof RemoteClass) {
  1138.                   RemoteClass var33 = (RemoteClass)var5;
  1139.                   this.out.print("    superclass = ");
  1140.                   RemoteClass var15 = var33.getSuperclass();
  1141.                   this.out.println(var15 == null ? "null" : var15.description());
  1142.                   this.out.print("    loader = ");
  1143.                   RemoteObject var16 = var33.getClassLoader();
  1144.                   this.out.println(var16 == null ? "null" : var16.description());
  1145.                   RemoteClass[] var17 = var33.getInterfaces();
  1146.                   if (var17 != null && var17.length > 0) {
  1147.                      this.out.println("    interfaces:");
  1148.  
  1149.                      for(int var18 = 0; var18 < var17.length; ++var18) {
  1150.                         this.out.println("        " + var17[var18]);
  1151.                      }
  1152.                   }
  1153.                }
  1154.  
  1155.                RemoteField[] var34 = ((RemoteObject)var5).getFields();
  1156.                if (var5 instanceof RemoteClass && var34.length > 0) {
  1157.                   this.out.println();
  1158.                }
  1159.  
  1160.                for(int var35 = 0; var35 < var34.length; ++var35) {
  1161.                   String var36 = var34[var35].getTypedName();
  1162.                   String var37 = var34[var35].getModifiers();
  1163.                   this.out.print("    " + var37 + var36 + " = ");
  1164.                   RemoteValue var38 = ((RemoteObject)var5).getFieldValue(var35);
  1165.                   this.out.println(var38 == null ? "null" : var38.description());
  1166.                }
  1167.  
  1168.                this.out.println("}");
  1169.             } else {
  1170.                this.out.println(var5.toString());
  1171.             }
  1172.          }
  1173.  
  1174.          return true;
  1175.       }
  1176.    }
  1177.  
  1178.    void help() {
  1179.       this.out.println("** command list **");
  1180.       this.out.println("threads [threadgroup]     -- list threads");
  1181.       this.out.println("thread <thread id>        -- set default thread");
  1182.       this.out.println("suspend [thread id(s)]    -- suspend threads (default: all)");
  1183.       this.out.println("resume [thread id(s)]     -- resume threads (default: all)");
  1184.       this.out.println("where [thread id] | all   -- dump a thread's stack");
  1185.       this.out.println("threadgroups              -- list threadgroups");
  1186.       this.out.println("threadgroup <name>        -- set current threadgroup\n");
  1187.       this.out.println("print <id> [id(s)]        -- print object or field");
  1188.       this.out.println("dump <id> [id(s)]         -- print all object information\n");
  1189.       this.out.println("locals                    -- print all local variables in current stack frame\n");
  1190.       this.out.println("classes                   -- list currently known classes");
  1191.       this.out.println("methods <class id>        -- list a class's methods\n");
  1192.       this.out.println("stop in <class id>.<method> -- set a breakpoint in a method");
  1193.       this.out.println("stop at <class id>:<line> -- set a breakpoint at a line");
  1194.       this.out.println("up [n frames]             -- move up a thread's stack");
  1195.       this.out.println("down [n frames]           -- move down a thread's stack");
  1196.       this.out.println("clear <class id>:<line>   -- clear a breakpoint");
  1197.       this.out.println("step                      -- execute current line");
  1198.       this.out.println("cont                      -- continue execution from breakpoint\n");
  1199.       this.out.println("catch <class id>          -- break for the specified exception");
  1200.       this.out.println("ignore <class id>         -- ignore when the specified exception\n");
  1201.       this.out.println("list [line number|method] -- print source code");
  1202.       this.out.println("use [source file path]    -- display or change the source path\n");
  1203.       this.out.println("memory                    -- report memory usage");
  1204.       this.out.println("gc                        -- free unused objects\n");
  1205.       this.out.println("load classname            -- load Java class to be debugged");
  1206.       this.out.println("run <class> [args]        -- start execution of a loaded Java class");
  1207.       this.out.println("!!                        -- repeat last command");
  1208.       this.out.println("help (or ?)               -- list commands");
  1209.       this.out.println("exit (or quit)            -- exit debugger");
  1210.    }
  1211.  
  1212.    void executeCommand(StringTokenizer var1) {
  1213.       String var2 = var1.nextToken().toLowerCase();
  1214.  
  1215.       try {
  1216.          if (var2.equals("print")) {
  1217.             this.print(var1, false, false);
  1218.          } else if (var2.equals("dump")) {
  1219.             this.print(var1, true, false);
  1220.          } else if (var2.equals("locals")) {
  1221.             this.locals();
  1222.          } else if (var2.equals("classes")) {
  1223.             this.classes();
  1224.          } else if (var2.equals("methods")) {
  1225.             this.methods(var1);
  1226.          } else if (var2.equals("threads")) {
  1227.             this.threads(var1);
  1228.          } else if (var2.equals("thread")) {
  1229.             this.thread(var1);
  1230.          } else if (var2.equals("suspend")) {
  1231.             this.suspend(var1);
  1232.          } else if (var2.equals("resume")) {
  1233.             this.resume(var1);
  1234.          } else if (var2.equals("threadgroups")) {
  1235.             this.threadGroups();
  1236.          } else if (var2.equals("threadgroup")) {
  1237.             this.threadGroup(var1);
  1238.          } else if (var2.equals("catch")) {
  1239.             this.catchException(var1);
  1240.          } else if (var2.equals("ignore")) {
  1241.             this.ignoreException(var1);
  1242.          } else if (var2.equals("cont")) {
  1243.             this.cont();
  1244.          } else if (var2.equals("step")) {
  1245.             this.step();
  1246.          } else if (var2.equals("next")) {
  1247.             this.next();
  1248.          } else if (var2.equals("kill")) {
  1249.             this.kill(var1);
  1250.          } else if (var2.equals("where")) {
  1251.             this.where(var1);
  1252.          } else if (var2.equals("up")) {
  1253.             this.method_0(var1);
  1254.          } else if (var2.equals("down")) {
  1255.             this.down(var1);
  1256.          } else if (var2.equals("load")) {
  1257.             this.load(var1);
  1258.          } else if (var2.equals("run")) {
  1259.             this.run(var1);
  1260.          } else if (var2.equals("memory")) {
  1261.             this.memory();
  1262.          } else if (var2.equals("gc")) {
  1263.             this.method_1();
  1264.          } else if (!var2.equals("trace") && !var2.equals("itrace")) {
  1265.             if (var2.equals("stop")) {
  1266.                this.stop(var1);
  1267.             } else if (var2.equals("clear")) {
  1268.                this.clear(var1);
  1269.             } else if (var2.equals("list")) {
  1270.                this.list(var1);
  1271.             } else if (var2.equals("use")) {
  1272.                this.use(var1);
  1273.             } else if (!var2.equals("help") && !var2.equals("?")) {
  1274.                if (!var2.equals("quit") && !var2.equals("exit")) {
  1275.                   this.out.println("huh? Try help...");
  1276.                } else {
  1277.                   this.debugger.close();
  1278.                   System.exit(0);
  1279.                }
  1280.             } else {
  1281.                this.help();
  1282.             }
  1283.          } else {
  1284.             this.trace(var2, var1);
  1285.          }
  1286.       } catch (Exception var4) {
  1287.          this.out.println("Internal exception:");
  1288.          this.out.flush();
  1289.          ((Throwable)var4).printStackTrace();
  1290.       }
  1291.    }
  1292.  
  1293.    void readCommandFile(File var1) {
  1294.       try {
  1295.          if (var1.canRead()) {
  1296.             DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
  1297.  
  1298.             String var3;
  1299.             while((var3 = var2.readLine()) != null) {
  1300.                StringTokenizer var4 = new StringTokenizer(var3);
  1301.                if (var4.hasMoreTokens()) {
  1302.                   this.executeCommand(var4);
  1303.                }
  1304.             }
  1305.  
  1306.             return;
  1307.          }
  1308.       } catch (IOException var5) {
  1309.       }
  1310.  
  1311.    }
  1312.  
  1313.    public TTY(String var1, String var2, String var3, String var4, PrintStream var5, PrintStream var6, boolean var7) throws Exception {
  1314.       System.out.println("Initializing jdb...");
  1315.       this.out = var5;
  1316.       this.console = var6;
  1317.       if (var2 == null) {
  1318.          this.debugger = new RemoteDebugger(var3, this, var7);
  1319.       } else {
  1320.          this.debugger = new RemoteDebugger(var1, var2, this, var7);
  1321.       }
  1322.  
  1323.       DataInputStream var8 = new DataInputStream(System.in);
  1324.       String var9 = null;
  1325.       if (var4 != null && var4.length() > 0) {
  1326.          StringTokenizer var10 = new StringTokenizer(var4);
  1327.          this.load(var10);
  1328.          this.lastArgs = var4;
  1329.       }
  1330.  
  1331.       Thread.currentThread().setPriority(5);
  1332.       File var13 = new File(System.getProperty("user.home") + System.getProperty("file.separator") + "jdb.ini");
  1333.       if (!var13.canRead()) {
  1334.          var13 = new File(System.getProperty("user.home") + System.getProperty("file.separator") + ".jdbrc");
  1335.       }
  1336.  
  1337.       this.readCommandFile(var13);
  1338.       var13 = new File(System.getProperty("user.dir") + System.getProperty("file.separator") + "startup.jdb");
  1339.       this.readCommandFile(var13);
  1340.  
  1341.       while(true) {
  1342.          this.printPrompt();
  1343.          String var11 = var8.readLine();
  1344.          if (var11 == null) {
  1345.             this.out.println("Input stream closed.");
  1346.             return;
  1347.          }
  1348.  
  1349.          if (var11.startsWith("!!") && var9 != null) {
  1350.             var11 = var9 + var11.substring(2);
  1351.             this.out.println(var11);
  1352.          }
  1353.  
  1354.          StringTokenizer var12 = new StringTokenizer(var11);
  1355.          if (var12.hasMoreTokens()) {
  1356.             var9 = var11;
  1357.             this.executeCommand(var12);
  1358.          }
  1359.       }
  1360.    }
  1361.  
  1362.    public static void main(String[] var0) {
  1363.       String var1;
  1364.       try {
  1365.          var1 = InetAddress.getLocalHost().getHostName();
  1366.       } catch (Exception var12) {
  1367.          var1 = null;
  1368.       }
  1369.  
  1370.       if (var1 == null) {
  1371.          var1 = "localhost";
  1372.       }
  1373.  
  1374.       String var2 = null;
  1375.       String var3 = null;
  1376.       String var4 = "";
  1377.       String var5 = "";
  1378.       boolean var6 = false;
  1379.  
  1380.       for(int var7 = 0; var7 < var0.length; ++var7) {
  1381.          String var8 = var0[var7];
  1382.          if (var8.equals("-dbgtrace")) {
  1383.             var6 = true;
  1384.          } else if (!var8.equals("-cs") && !var8.equals("-checksource") && !var8.equals("-noasyncgc") && !var8.equals("-prof") && !var8.equals("-v") && !var8.equals("-verbose") && !var8.equals("-verify") && !var8.equals("-noverify") && !var8.equals("-verifyremote") && !var8.equals("-verbosegc") && !var8.startsWith("-ms") && !var8.startsWith("-mx") && !var8.startsWith("-ss") && !var8.startsWith("-oss") && !var8.startsWith("-D")) {
  1385.             if (var8.equals("-classpath")) {
  1386.                if (var7 == var0.length - 1) {
  1387.                   System.out.println("No classpath specified.");
  1388.                   System.exit(1);
  1389.                }
  1390.  
  1391.                StringBuffer var10000 = (new StringBuffer()).append(var5).append(var8).append(" ");
  1392.                ++var7;
  1393.                var5 = var10000.append(var0[var7]).append(" ").toString();
  1394.             } else if (var8.equals("-host")) {
  1395.                if (var7 == var0.length - 1) {
  1396.                   System.out.println("No host specified.");
  1397.                   System.exit(1);
  1398.                }
  1399.  
  1400.                ++var7;
  1401.                var2 = var0[var7];
  1402.             } else if (var8.equals("-password")) {
  1403.                if (var7 == var0.length - 1) {
  1404.                   System.out.println("No password specified.");
  1405.                   System.exit(1);
  1406.                }
  1407.  
  1408.                ++var7;
  1409.                var3 = var0[var7];
  1410.             } else {
  1411.                var4 = var4 + var8 + " ";
  1412.             }
  1413.          } else {
  1414.             var5 = var5 + var8 + " ";
  1415.          }
  1416.       }
  1417.  
  1418.       if (var2 != null && var3 == null) {
  1419.          System.out.println("A debug password must be specified for remote debugging.");
  1420.          System.exit(1);
  1421.       }
  1422.  
  1423.       if (var2 == null) {
  1424.          var2 = var1;
  1425.       }
  1426.  
  1427.       try {
  1428.          if (!var2.equals(var1) && var3.length() == 0) {
  1429.             System.out.println("No password supplied for accessing remote Java interpreter.");
  1430.             System.out.println("The password is reported by the remote interpreterwhen it is started.");
  1431.             System.exit(1);
  1432.          }
  1433.  
  1434.          new TTY(var2, var3, var5, var4, System.out, System.out, var6);
  1435.       } catch (SocketException var9) {
  1436.          System.out.println("Failed accessing debugging session on " + var2 + ": invalid password.");
  1437.       } catch (NumberFormatException var10) {
  1438.          System.out.println("Failed accessing debugging session on " + var2 + ": invalid password.");
  1439.       } catch (Exception var11) {
  1440.          System.out.print("Internal exception:  ");
  1441.          System.out.flush();
  1442.          ((Throwable)var11).printStackTrace();
  1443.       }
  1444.    }
  1445. }
  1446.